# -*- coding:utf-8 -*-

# @Time    : 2023/9/4 04:11
# @Author  : zengwenjia
# @Email   : zengwenjia@lingxi.ai
# @Software: LLM_internal

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
from bot.insurance_planner_gpt.agent.base_agent import LLMAgent
import asyncio
import os
from knowledge_base.knowledge_embedding import BGEQuery

default_template = """
作为一个最专业规划师的解决方案构建agent,你需要基于从用户目标出发的提案和全面客观的优劣对比，辅助用户完成整个方案的各个要素的选择决策，根据对话用户信息和解决方案因果图，请一步步思考，选择要沟通的方案，并补充方案对应的用户沟通策略，用于辅助用户完成整个方案的各个要素的选择决策。
你可以做的决策只包括如下几种：（需用户提供）、（潜在需求）、（需计算）、（需讲解）、（确认是否认可产品）。
- （需用户提供）：需要用户提供被保人及其年龄，有利于进一步明确产品类型或产品属性
- （潜在需求）：你需要根据用户的问题和用户的信息及解决方案，预估用户可能潜在的风险、需求、偏好，因果链中节点的值中加上（潜在需求）
- （需计算）：需要计算保费
- （需讲解）：需要讲解产品类型、具体产品及其相关保障责任的信息，如果用户有其他问题需解答也加上（需讲解）
- （确认是否认可产品）：如果已经和用户聊完了产品的所有信息，需要向确认用户是否认可产品
需要注意以下情况：
1、基于建议的解决方案和对话信息完善因果图，缺少部分用户信息，因果图中节点的值中加上"（需用户提供）"，且该因果链需要停止
2、需用户提供，一定是用户本身的信息，且是用户愿意提供的，不能把产品信息当做用户需要提供的，你需要返回最重要且用户最可能提供的信息，如果用户已经给出了，就不需要再找用户提供；每次需要用户提供信息的最多不要超过2个
3、潜在需求一定是落到用户自身上（是用户可能需要什么），而不是落在产品上（不要根据产品名称推断产品特点，这不是需求），最多也不要超过2个
4、不要让用户提供健康情况的信息，不要预估被保对象任何当前的健康情况和有无购买保险情况等潜在需求，特别是被保人是小孩时，你当前并不具备解决用户健康情况和保险保单分析的能力。
6、不要自己创建新的因果链，只能在【建议的解决方案因果】中完善因果链；也能不能删除因果链里的内容（尤其是保险类型、保险产品类型、保险产品名称、产品条款这种关键信息），只能在因果链末尾补充沟通策略（需用户提供）、（潜在需求）、（需计算）、（需讲解）、（确认是否认可产品）。
7、如果用户不明确自己需要多少的保额或需要告知用户保额/保费，在节点中的值中加上"（需计算）"，但不能在（需用户提供）后面增加，且该因果链需要停止
8、结合用户的人生阶段来推断可能的疾病风险以及对应的潜在需求，例如：婴儿期/低龄儿童的免疫系统未完全发育易生病发烧，推断需要挂号方便的特需门诊（潜在需求）
9、目前你只具备推荐在已有知识库里规划保险的能力，因此方案中出现'超出范围'时，你需要在因果链的下一个节点写上'请用户自己查阅资料（超出范围）'
11、【建议的解决方案因果】是整个沟通过程中的因果图，你需要根据当前用户最关注的问题去选择要沟通的内容，即（需用户提供）、（潜在需求）、（需计算）、（需讲解）这几种决策只出现在当下需要沟通的方案链路后面，而其他已完成沟通的方案不需要再输出
12、（需讲解）只是讲解产品类型、具体产品及其相关保障责任的信息，其他的都不要加上（需讲解）的策略，比如保费保额等要计算的信息、需要确认用户需求的信息、需要用户提供的信息等，都不要加上（需讲解）的策略
13、不能在因果链新增保险知识，你只是做沟通策略的决策，不要自己发挥保险知识，你只能新增需要用户提供的信息、用户可能存在的需求偏好、需要计算的信息


已提供的用户问题：
===
{user_question}
===
{user_info}
{solution_plan_causals}
对话上下文信息：
===
{conversation_history}
===
根据对话用户信息和解决方案因果图，请一步步思考，基于用户问题、用户信息及解决方案因,补充下一步和用户沟通策略的因果链：
"""


class CommunicationStrategy(LLMAgent):

    def __init__(self, user_question, user_info, solution_plan_causals, conversation_history):

        if user_info:
            self.user_info = "【当前用户情境】：\n===\n" + str(user_info) + "\n===\n"
        else:
            self.user_info = ""

        if solution_plan_causals:
            self.solution_plan_causals = "【建议的解决方案因果】：\n===\n" + str(solution_plan_causals) + "\n===\n"
        else:
            self.solution_plan_causals = ""
        # if user_info_knowledge_infos:
        #     self.user_info_knowledge_infos = "解决方案的背景知识：" + "\n".join(
        #         [str(user_info_knowledge_info) for user_info_knowledge_info in user_info_knowledge_infos])
        # else:
        #     self.user_info_knowledge_infos = ""

        self.prompt = default_template.format(user_question=user_question,
                                              user_info=self.user_info,
                                              solution_plan_causals=self.solution_plan_causals,
                                              conversation_history=conversation_history)
        super().__init__(self.prompt)


if __name__ == "__main__":
    user_question = "保险规划_30岁买医疗险的需求"
    # user_info = {"孩子年龄": 5}
    # user_info = {}
    user_info = {}
    solution_plan_causals = """无"""

    conversation_history = """

犀心小助：太棒了，关注个人医疗保障是非常明智的选择！首先，我们需要明确一下具体的医疗保险类型，比如普通的医疗险、重疾险或者是医疗意外险等。😊 每种类型的医疗险在保障内容和保费上都有所不同。为了更好地为您提供个性化的建议，能否先告诉我您对保险的预算范围？这样我可以帮您筛选出既符合预算又能满足您需求的产品。同时，如果您对理赔的快速性有特别的要求，也请告诉我，我会优先考虑理赔服务快速的医疗险产品。当然啦，如果您有其他的特定偏好或需求，也请不吝告知，我会用心为您定制保障方案。🌈

用户：我预算每年10000元 先考虑下重疾险吧  理赔速度肯定越快越好
犀心小助：
嗯，年预算10000元选择重疾险是个不错的方案👍，而且我完全能理解您希望理赔速度快的需求。接下来，为了让我能够更准确地帮您找到合适的保险产品，还需要了解一些其他信息：
1. 请问您的年龄范围？这有助于我们计算保费和为您推荐相应年龄段的产品。
2. 您的健康状况怎么样？比如有没有既往病史，这可能会影响到保险公司的承保条款。
3. 您对保险保障内容有没有特别的要求？比如关注的病种是否广泛，或者对某一类疾病想要更高的保障。
4. 您比较倾向于短期保障还是长期保障？这样我才能帮您筛选出保障期限符合您需求的产品。
5. 对于保额，您希望在什么范围内？比如是希望有足够的保额来覆盖可能的大额医疗费用，还是仅需要基本保障？
能够获得这些信息后，我就可以为您精准推荐，找到性价比高、理赔效率高、保单条款简明、适合您需求的重疾险产品啦！🏆📑
用户：我今年30岁  现在很健康 我想保障下肿瘤的治疗
犀心小助：既然您今年30岁且身体健康，想要重点保障肿瘤治疗，那这方面的需求我完全明白了！💪✨ 那么我们需要确定一下保障期限和保额的问题：
1. 对于保障期限，您是喜欢长期的保障还是短期内的保险呢？长期保障一般保障到70岁甚至终身，而短期保障则是几年一续的形式，每次保障期限较短，但灵活性更高。
2. 关于保额，您希望保险能覆盖多少？是想要有个基础的保障，还是希望能有更高额度以面对未知的风险呢？

同时，您也可以考虑是否需要增加一些特别的保障，如重度恶性肿瘤扩展保险金，它可以为您提供更全面的肿瘤保障。这样一来，您就可以有一个专为肿瘤治疗而准备的综合保障，确保在关键时刻给予您足够的经济支持。我们可以根据您的具体偏好和需求，为您定制一个合适的保障方案。🔍💡
        """
    solution_plan_causal_list = solution_plan_causals.split("\n")
    # knowledge_infos = []
    # knowledge_base_query = BGEQuery()
    # # knowledge_base_query = AZUREQuery()
    # knowledge_base_query.load_all_knowledge_base()
    # for solution_plan_causal in solution_plan_causal_list:
    #     if not solution_plan_causal:
    #         continue
    #     results = knowledge_base_query.search_product_with_score(solution_plan_causal, top_k=4)
    #     if results:
    #         for result in results:
    #             knowledge_infos.append(result.metadata)
    # print(knowledge_infos)
    plan_explain_assume = CommunicationStrategy(user_question, user_info, "对肿瘤保障有需求->医享无忧惠享版百万医疗险—个人版（保险产品名称）", conversation_history)
    plan_explain_assume_str = asyncio.run(plan_explain_assume.achat_auto_llm(type="gpt"))
    print(plan_explain_assume_str)
